package com.mo.lib

import android.content.Context
import android.view.Gravity
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.OnLifecycleEvent
import androidx.lifecycle.ProcessLifecycleOwner
import androidx.multidex.MultiDex
import androidx.multidex.MultiDexApplication
import com.hjq.toast.ToastUtils
import com.mo.lib.constans.AOP_TAG_CLICK
import com.mo.lib.constans.AOP_TAG_GPS
import com.mo.lib.constans.AOP_TAG_GPS_DIALOG
import com.mo.lib.constans.AOP_TAG_NET
import com.mo.lib.ui.dialog.BaseIosDialog
import com.mo.lib.utils.KLog
import com.mo.lib.utils.isFastClick
import com.mo.lib.utils.showToast
import com.mo.lib.utils.toSettingGps
import com.xuexiang.xaop.XAOP
import com.xuexiang.xaop.annotation.Permission
import com.xuexiang.xaop.checker.Interceptor
import com.xuexiang.xaop.util.PermissionUtils
import com.xuexiang.xutil.XUtil
import com.xuexiang.xutil.net.NetworkUtils
import org.aspectj.lang.JoinPoint
import org.litepal.LitePal

/**
 * @ author：mo
 * @ data：2022/3/25:15:24
 * @ 功能：
 */
open class BaseApplication : MultiDexApplication() {
    override fun onCreate() {
        super.onCreate()
        initSdk()
        ProcessLifecycleOwner.get().lifecycle.addObserver(object : ApplicationObserver() {

            override fun onAppBack() {  //从后台返回APP
                onAppForeground()
            }

            override fun onAppLeave() {       //切到后台
                onAppBackground()
            }
        })
    }

    open fun initSdk() {

        //初始化吐司框架
        ToastUtils.init(this)
        ToastUtils.setGravity(Gravity.BOTTOM, 0, 150)

        //初始化数据库
        LitePal.initialize(this)

        //XUI初始化
        XUtil.init(this)
        XUtil.debug("飞哥爱你哦！")


        XAOP.init(this) //XAOP初始化
        XAOP.setOnPermissionDeniedListener { //设置动态申请权限切片 申请权限被拒绝的事件响应监听//申请权限被拒绝的处理
            showToast("申请权限被拒绝,")
        } //设置自定义拦截切片的处理拦截器
        XAOP.setInterceptor(Interceptor { type, joinPoint -> //@Intercept
            //            return@Interceptor onInterceptor(type, joinPoint, (joinPoint.`this` as Object).getContext())
            return@Interceptor onInterceptor(type, joinPoint)
        })

    }
    open fun onAppForeground() {
    }

    open fun onAppBackground() {
    }

    /**解决65536**/
    override fun attachBaseContext(base: Context?) {
        super.attachBaseContext(base)
        MultiDex.install(this)
    }

    override fun onTerminate() {
        super.onTerminate()
        onAppForeground()
    }

    /** 拦截监听 type==拦截类型标识  joinPoint==注入点，添加拦截位置的一些信息，context==上下文，一般不会空*/
    open fun onInterceptor(type: Int, joinPoint: JoinPoint): Boolean {
        when (type) {
            AOP_TAG_NET -> {
                if (!NetworkUtils.isNetworkAvailable()) {
                    showToast("网络已断开，请检查网络连接！")
                    return true
                }
            }
            AOP_TAG_GPS -> {
                if (!NetworkUtils.isGpsEnabled()) {
                    showToast("GPS未开启,请前往设置开启")
                    return true
                }
            }
            AOP_TAG_GPS_DIALOG -> {
                if (!NetworkUtils.isGpsEnabled()) {
                    BaseIosDialog().setTitle("请打开GPS连接").setMsg("为了方便您使用本软件，请先打开GPS").setLeftTextView("").setRightTextView("去设置") { toSettingGps() }.show()
                    return true
                }
            }
            AOP_TAG_CLICK -> { //拦截快速点击
                if (!isFastClick()) {
                    KLog.i("快速点击拦截") //                    showToast("请勿快速多次点击")
                    return true
                }
            }
        }
        return false
    }
}


/** 程序进程层面的生命周期监听  */
abstract class ApplicationObserver : LifecycleObserver {
    /** 从后台返回APP前台  */
    @OnLifecycleEvent(Lifecycle.Event.ON_START) abstract fun onAppBack()

    /** 从前台切到后台  */
    @OnLifecycleEvent(Lifecycle.Event.ON_STOP) abstract fun onAppLeave()

}